package com.sofa.permission.controller;

import com.sofa.api.dto.permission.UserRoleDTO;
import com.sofa.permission.service.IRolesService;
import com.sofa.permission.service.IUserRolesService;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@Slf4j
@RestController
@RequestMapping("/permission")
@RequiredArgsConstructor
public class PermissionController {

    private final IUserRolesService userRoleService;

    /**
     * 绑定默认角色
     * @param userId 用户ID
     */
    @ApiOperation("绑定默认角色")
    @PostMapping("/bind/{userId}")
    public Boolean bindDefaultRole(@PathVariable("userId") Long userId) {
        return userRoleService.bindDefaultRole(userId);
    }

    /**
     * 获取用户角色代码
     * @param userId 用户ID
     * @return 角色代码
     */

    //这里注解一定要加上produces = MediaType.TEXT_PLAIN_VALUE,不然返回的字符串带""
    //找了半天才发现是这里的问题
    @ApiOperation("获取用户扮演角色")
    @GetMapping(value = "/role/code/{userId}", produces = MediaType.TEXT_PLAIN_VALUE)
    public String getUserRoleCode(@PathVariable("userId") Long userId) {
        return userRoleService.getUserRoleCode(userId);
    }

    /**
     * 根据角色获取用户id列表
     * @param roleCode 角色
     * @return 用户id列表
     */
    @ApiOperation("根据角色获取用户id列表")
    @GetMapping("/role/users/{roleCode}")
    List<Long> getUserIdsByRolesCode(@PathVariable("roleCode") String roleCode){
        return userRoleService.getUserIdsByRolesCode(roleCode);
    }


    /**
     * 超管调用: 升级为管理员
     * @param userId 用户id
     */
    @ApiOperation("将用户升级为管理员")
    @PostMapping("/upgrade/{userId}")
    public Boolean upgradeToAdmin(@PathVariable("userId") Long userId) {
//        log.info("进入 upgradeToAdmin，收到 userId: {}", userId);
        return userRoleService.upgradeToAdmin(userId);
    }

    /**
     * 超管调用: 降级为普通用户
     * @param userId 用户id
     */
    @ApiOperation("将管理员降级为普通用户")
    @PostMapping("/downgrade/{userId}")
    public Boolean downgradeToUser(@PathVariable("userId") Long userId) {
        return userRoleService.downgradeToUser(userId);
    }

    /**
     * 根据用户列表返回用户对应角色
     * @param userIds 用户id列表
     * @return
     */
    @ApiOperation("根据用户id列表获取用户角色数据")
    @PostMapping("/role/code/batch")
    List<UserRoleDTO> getUserRoleByUserIds(@RequestBody List<Long> userIds){
        return userRoleService.getUserRoleByUserIds(userIds);
    }

} 